﻿using System.Collections.Generic;
using Sinacor.Infra.Service.Common;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using Sinacor.Infra.Service.Validation;

namespace Sinacor.Servico.Bovespa.Corretagem.BusinessLogic
{
    /// <summary>
    /// Logica de negocios para controle de beneficios de politicas de corretagem
    /// </summary>
    public class ControleBeneficio : BaseBusinessLogic
    {
        #region Atributos

        private int _erroObjetoNulo = 109530;
        ResourceAccess.ControleBeneficio _raControleBeneficio = null;

        #endregion

        #region Construtor

        /// <summary>
        /// Construtor ControleBeneficio
        /// </summary>
        public ControleBeneficio()
            : base()
        {
            this._raControleBeneficio = new ResourceAccess.ControleBeneficio();
        }

        #endregion

        #region Propriedades

        public int ErroObjetoNulo
        {
            get
            {
                return _erroObjetoNulo;
            }
            set
            {
                _erroObjetoNulo = value;
            }
        }

        #endregion

        #region MÃ©todos

        /// <summary>
        /// Consulta lista de controles de beneficios de politicas de corretagem conforme
        /// filtro.
        /// </summary>
        /// <param name="entity"></param>
        public List<BusinessEntity.ControleBeneficio> ConsultarControlesBeneficios(BusinessEntity.Parameter.FiltroControleBeneficio entity)
        {
            if (entity != null)
                return this._raControleBeneficio.ConsultarControlesBeneficios(entity);
            else
                throw new BusinessException(ErroObjetoNulo);
        }

        /// <summary>
        /// Exclui todos os benefÃ­cios de uma polÃ­tica de corretagem.
        /// 
        /// Obs: Basta informar o codigo da polÃ­tica e a data inicial da mesma no filtro
        /// para efetuar a exclusÃ£o.
        /// </summary>
        /// <param name="entity"></param>
        public void ExcluirTodosBeneficiosPolitica(BusinessEntity.Parameter.FiltroControleBeneficioChave entity)
        {
            if (entity != null && entity.CodigoPolitica.HasValue && entity.DataInicial.HasValue)
            {
                this._raControleBeneficio.ExcluirTodosBeneficiosPolitica(entity);
            }
            else
            {
                throw new BusinessException(ErroObjetoNulo);
            }
        }

        /// <summary>
        /// Exclui um controle de benefÃ­cio de politica de corretagem.
        /// </summary>
        /// <param name="entity"></param>
        public void ExcluirControleBeneficio(BusinessEntity.Parameter.FiltroControleBeneficioChave entity)
        {
            SinacorValidation validation = null;

            //ValidaÃ§Ã£o de RulesSets
            validation = new SinacorValidation();
            validation.Validate<BusinessEntity.Parameter.FiltroControleBeneficioChave>(entity);
            validation.Validate();

            this._raControleBeneficio.ExcluirControleBeneficio(entity);
        }

        /// <summary>
        /// Duplica a lista de controle de benefÃ­cios da polÃ­tica de corretagem base para a
        /// nova polÃ­tica de corretagem.
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="novaPolitica"></param>
        public void DuplicarControlesBeneficiosPolitica(BusinessEntity.Parameter.FiltroPoliticaCorretagemChave entity, ref BusinessEntity.PoliticaCorretagem novaPolitica)
        {
            if (entity != null && novaPolitica != null)
            {
                this._raControleBeneficio.DuplicarControlesBeneficiosPolitica(entity, new BusinessEntity.Parameter.FiltroPoliticaCorretagemChave { Codigo = novaPolitica.Codigo, DataInicial = novaPolitica.DataInicial });
                novaPolitica.Beneficios = this.ConsultarControlesBeneficios(new BusinessEntity.Parameter.FiltroControleBeneficio { CodigoPolitica = novaPolitica.Codigo, DataInicial = novaPolitica.DataInicial });
            }
            else
            {
                throw new BusinessException(ErroObjetoNulo);
            }
        }

        /// <summary>
        /// Inclui um controle de benefÃ­cio de politica de corretagem
        /// </summary>
        /// <param name="entity"></param>
        public void IncluirControleBeneficio(BusinessEntity.ControleBeneficio entity)
        {
            if (entity != null)
            {
                SinacorValidation validation = null;

                //ValidaÃ§Ã£o de RulesSets
                validation = new SinacorValidation();
                validation.Validate<BusinessEntity.ControleBeneficio>(entity);
                validation.Validate();

                this._raControleBeneficio.IncluirControleBeneficio(entity);
            }
            else
            {
                throw new BusinessException(ErroObjetoNulo);
            }
        }

        /// <summary>
        /// Inclui uma lista de controles de beneficios de politicas de corretagem.
        /// </summary>
        /// <param name="entityList"></param>
        public void IncluirControlesBeneficios(List<BusinessEntity.ControleBeneficio> entityList)
        {
            if (entityList != null)
            {
                if (entityList.Count > 0)
                {
                    foreach (BusinessEntity.ControleBeneficio item in entityList)
                    {
                        this.IncluirControleBeneficio(item);
                    }
                }
            }
            else
            {
                throw new BusinessException(ErroObjetoNulo);
            }
        }
        
        #endregion
    }
}